# Pandas和NumPy的比较

# 适应性	Pandas主要用来处理类表格数据。	            NumPy 主要用来处理数值数据。
# 工具	Pandas提供了Series和DataFrame数据结构。	NumPy 构建了 ndarray array来容纳数据。
# 性能	Pandas对于处理50万行以上的数据更具优势。	    NumPy 则对于50万以下或者更少的数据，性能更佳。
# 内存利用率	与 NumPy相比，Pandas会消耗大量的内存。	NumPy 会消耗较少的内存。
# 对象	Pandas 提供了 DataFrame 2D数据表对象。	    NumPy 则提供了一个多维数组 ndarray 对象

# 创建数组
# 数组的主要作用是在一个变量中存储多个值。NumPy 可以轻松地处理多维数组
import pandas as pd
import numpy as np
import array

arr1 = np.array([2, 4, 6, 8, 10, 12])   # <class 'numpy.ndarray'>
# Python 本身没有数组这个说法，不过 Python 提供一个 array 模块，用于创建数字、字符类型的数组，它能够容纳字符型、整型、浮点型等基本类型。
arr2 = array.array('l', [2, 4, 6, 8, 10, 12])

# 布尔索引是 NumPy 的重要特性之一，通常与 Pandas 一起使用。它的主要作用是过滤 DataFrame 中的数据，比如布尔值的掩码操作。
dict = {'name': ["Smith", "William", "Phill", "Parker"],
        'age': ["28", "39", "34", "36"]}
info = pd.DataFrame(dict, index=[True, True, False, True])
print(info)
# 然后使用.loc访问索引为 True 的数据
print(info.loc[True])

# 需要执行一些 NumPy 数值计算的高级函数，这个时候您可以使用 to_numpy() 函数，将 DataFrame 对象转换为 NumPy ndarray 数组
info = pd.DataFrame({"P": [2, 3], "Q": [4.0, 5.8]})
# 给info添加R列
info['R'] = pd.date_range('2020-12-23', periods=2)
print(info)
# 将其转化为numpy数组
n = info.to_numpy()
print(n)
print(type(n))

# 在 if 语句中，如果您需要将 Pandas 对象转换为布尔值时，需要格外留意，这种操作会引起  ValueError 异常
if pd.Series([False, True, False]):
    print('I am True')

if pd.Series([False, True, False]).any():
    print("I am 编程帮 www.biancheng.com")

# 如果要是计算单个布尔元素的 Series 对象，那么您可以使用 bool() 方法进行修改
print(pd.Series([False]).bool())

# 如果在 Pandas 对象中使用==（相等）和!=（不相等） 这样的布尔运算符时，将返回一个布尔序列
s = pd.Series(range(4))
# 返回布尔值序列，行索引为3的位置为True
print(s == 3)
# 0    False
# 1    False
# 2    False
# 3    True
# dtype: bool

# isin() 也会返回一个布尔序列，它用来判断元素值是否包含在的 Series 序列中。
s = pd.Series(list('abc'))
s = s.isin(['a', 'c', 'e'])
print(s)
# 0    True
# 1    False
# 2    True
# dtype: bool

# reindex() 函数表示重置行索引，该方法会生成新的 Pandas 对象
# index行索引使用字符和数字混合的形式
df = pd.DataFrame(np.random.randn(6, 4), columns=['one', 'two', 'three', 'four'], index=['a', 'b', 2, 3, 'e', 5])
print(df)
# 数字与字符混合后取数据
print(df.reindex(['a', 'b', 5]))
print(df.reindex([2, 'e']))
